﻿//#define _CRT_SECURE_NO_WARNINGS 1
//#include<iostream>
//#include<vector>
//#include<Windows.h>
//using namespace std;
//
//template<class T>
//class ObjectPool
//{
//public:
//	T* New()
//	{
//		T* obj = nullptr;
//		// 如果⾃由链表有对象，直接取⼀个
//		if (_freeList)
//		{
//			obj = (T*)_freeList;
//			_freeList = *((void**)_freeList);
//		}
//		else
//		{
//			if (_leftBytes < sizeof(T))
//			{
//				_leftBytes = 128 * 1024;
//				_memory = (char*)malloc(_leftBytes);
//				if (_memory == nullptr)
//				{
//					throw std::bad_alloc();
//				}
//			}
//			obj = (T*)_memory;
//			size_t objSize = sizeof(T) < sizeof(void*) ? sizeof(void*) :
//				sizeof(T);//最少分出去一个指针大小的内存
//			_memory += objSize;//因此可能会导致出现内碎片
//			_leftBytes -= objSize;
//		}
//		new(obj)T;//定位new初始化obj指向的区域
//		return obj;
//	}
//	void Delete(T* obj)
//	{
//		// 显⽰调⽤T的析构函数进⾏清理
//		obj->~T();
//		// 头插到freeList
//		*((void**)obj) = _freeList;
//		_freeList = obj;
//	}
//private:
//	char* _memory = nullptr; // 指向内存块的指针
//	int _leftBytes = 0; // 内存块中剩余字节数
//	void* _freeList = nullptr; // 管理还回来的内存对象的⾃由链表
//};
//
//void TestObjectPool()
//{
//	// 申请释放的轮次
//	const size_t Rounds = 3;
//	// 每轮申请释放次数
//	const size_t N = 100000;
//
//	size_t begin1 = clock();//开始计时
//	vector<int*> v1;
//	v1.reserve(N);
//	for (size_t j = 0; j < Rounds; ++j)//计算new和delete的效率
//	{
//		for (int i = 0; i < N; ++i)
//		{
//			v1.push_back(new int);
//		}
//		for (int i = 0; i < N; ++i)
//		{
//			delete v1[i];
//		}
//		v1.clear();
//	}
//	size_t end1 = clock();
//
//	ObjectPool<int> TNPool;//创建内存池
//	size_t begin2 = clock();//开始计时
//	vector<int*> v2;
//	v2.reserve(N);
//	for (size_t j = 0; j < Rounds; ++j)//计算内存池效率
//	{
//		for (int i = 0; i < N; ++i)
//		{
//			v2.push_back(TNPool.New());
//		}
//		for (int i = 0; i < N; ++i)
//		{
//			TNPool.Delete(v2[i]);
//		}
//		v2.clear();
//	}
//	size_t end2 = clock();
//	cout << "new cost time:" << end1 - begin1 << endl;
//	cout << "object pool cost time:" << end2 - begin2 << endl;
//}
//
//int main()
//{
//	TestObjectPool();
//}